网络协议系统梳理
来源:MDN HTTP · MDN TLS · IETF RFCs · IANA
网络协议是计算机网络中设备之间通信的规则和标准。现代互联网建立在分层协议栈 (Layered Protocol Stack)之上,每一层对下层封装的数据进行抽象,向上一层提供服务。核心协议栈是 TCP/IP,对应理论参考模型 OSI。
1. 概述
互联网协议的核心设计思想:
| 原则 | 含义 | 体现 |
|---|---|---|
| 分层封装 (Layered Encapsulation) | 上层数据作为下层 payload | HTTP → TCP segment → IP packet → Ethernet frame |
| 端到端 (End-to-End) | 智能终端 + 简单网络 | TCP 拥塞控制 (Congestion Control)由两端负责,中间路由只转发 |
| 尽力而为 (Best Effort) | IP 层不保证交付 | 可靠性由 TCP 在上层弥补 |
| 无状态/有状态 | 协议选择取决于场景 | HTTP 无状态,TCP 有状态连接 |
术语
| 缩写 | 全称 | 说明 |
|---|---|---|
| LAN | Local Area Network | 局域网,小范围(办公室、家庭)的内部网络 |
| WAN | Wide Area Network | 广域网,跨地域的大型网络,互联网是最大的 WAN |
| MTU | Maximum Transmission Unit | 最大传输单元,链路层能承载的最大包长,以太网默认 1500 字节 |
| MSS | Maximum Segment Size | TCP 最大段大小 = MTU - IP头 - TCP头,通常 1460 字节 |
| RTT | Round-Trip Time | 往返时间,数据包从发出到收到确认的总耗时 |
| TTFB | Time To First Byte | 首字节时间,从发起请求到收到响应第一个字节的耗时 |
| payload | — | 有效载荷,协议中实际承载的上层数据,排除头部开销 |
| 协议栈 (Protocol Stack) | Protocol Stack | 多层协议堆叠形成的完整通信方案,下层封装为上层服务 |
2. 行为分析(协议做什么)
2.1 用例图:网络协议的参与者与功能
客户端(浏览器/App)通过协议栈 (Protocol Stack)与远端服务器交互,DNS 负责域名解析,中间路由器只转发 IP 包。
2.2 活动图:数据穿越协议栈 (Protocol Stack)
发送方从上到下逐层封装头部,接收方从下到上逐层解封,每层只处理自己的头部信息。
2.3 时序图:HTTPS 完整请求流程
从 DNS 解析开始,经历 TCP 三次握手 (Three-Way Handshake)、TLS 1.3 握手(1-RTT)、HTTP 请求/响应,到 TCP 四次挥手 (Four-Way Wave)。这是现代 Web 应用最核心的交互模式。
curl -w "DNS: %{time_namelookup}s\\nTCP: %{time_connect}s\\nTLS: %{time_appconnect}s\\nTTFB: %{time_starttransfer}s\\nTotal: %{time_total}s\\n" \\
-o /dev/null -s https://www.example.com
2.4 状态机图:TCP 连接状态迁移
TCP 连接从 CLOSED 到 ESTABLISHED 再到 CLOSED,有 11 种状态。服务端通常比客户端多出 LISTEN 和 CLOSE_WAIT 状态。
3. 结构分析(协议由什么组成)
3.1 包图:OSI 七层 vs TCP/IP 四层模型
OSI 是理论参考模型(7层),TCP/IP 是实际部署模型(4层)。OSI 的会话层 (Session Layer)/表示层 (Presentation Layer)在 TCP/IP 中被合并到应用层。
3.2 类图:核心协议头部结构
各层协议的头部(Header)定义了本层的控制信息。以下是 IPv4、TCP、UDP 和 HTTP 消息的头部字段结构。
3.3 部署图:协议栈 (Protocol Stack)在网络节点上的分布
不同网络节点运行的协议层级不同:终端运行完整协议栈 (Protocol Stack),路由器只运行到网络层(IP),交换机只运行到数据链路层 (Data Link Layer)。
4. 各层协议详解
4.1 IP 协议(网络层)
IP(Internet Protocol)是 TCP/IP 协议栈 (Protocol Stack)的核心,负责寻址和路由 (Addressing and Routing)。它提供"尽力而为 (Best Effort)"的无连接 (Connectionless)数据报 (Datagram)服务——不保证交付、不保证顺序、不保证不重复。
- 地址格式:
192.168.1.1 - 头部长度:20~60 字节
- 总地址数:约 43 亿
- 依赖 NAT 缓解枯竭
- 广播支持
- 地址格式:
2001:db8::1 - 头部长度:固定 40 字节
- 总地址数:约 3.4×10³⁸
- 不再需要 NAT
- 无广播,用组播替代
traceroute 正是利用此机制。
术语
| 缩写 | 全称 | 说明 |
|---|---|---|
| NAT | Network Address Translation | 网络地址转换,将私有 IP 映射到公网 IP,缓解 IPv4 地址枯竭 |
| ICMP | Internet Control Message Protocol | 互联网控制报文协议,用于诊断(ping)和错误报告(TTL 超时) |
| TTL | Time To Live | 生存时间,IP 包每经过一跳减 1,到 0 则丢弃(防环路) |
| ARP | Address Resolution Protocol | 地址解析协议,以 IP 查 MAC 地址。发送方广播"谁有 192.168.1.1?" |
| DHCP | Dynamic Host Configuration Protocol | 动态主机配置,自动分配 IP 地址、网关、DNS 给入网设备 |
| CIDR | Classless Inter-Domain Routing | 无类域间路由,用前缀长度表示子网,如 192.168.1.0/24 |
| AS / BGP | Autonomous System / Border Gateway Protocol | AS 是一个机构控制的 IP 网络集合;BGP 在 AS 之间交换路由信息——互联网的"邮政编码系统" |
4.2 TCP 协议(传输层——可靠)
TCP(Transmission Control Protocol)在不可靠的 IP 层之上提供可靠的、面向连接 (Connection-Oriented)的、字节流 (Byte Stream)传输服务。由 Vint Cerf 和 Bob Kahn 于 1974 年提出。
| 机制 | 实现方式 | 作用 |
|---|---|---|
| 确认与重传 (Acknowledgment & Retransmission) | ACK + 超时重传 | 保证数据不丢失 |
| 序列号 (Sequence Number) | 每字节编号 | 保证顺序、去重 |
| 流量控制 (Flow Control) | 滑动窗口 (Sliding Window)(Window) | 防止发送方压垮接收方 |
| 拥塞控制 (Congestion Control) | 慢启动 (Slow Start) / 拥堵避免 (Congestion Avoidance) / 快速恢复 (Fast Recovery) | 防止网络过载 |
| 三次握手 (Three-Way Handshake) | SYN → SYN-ACK → ACK | 建立双向连接 |
| 四次挥手 (Four-Way Wave) | FIN → ACK → FIN → ACK | 优雅关闭连接 |
server.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 8080))
s.listen(1)
conn, addr = s.accept()
print(f"Connected: {addr}")
data = conn.recv(1024)
conn.sendall(b"HTTP/1.1 200 OK\\r\\n\\r\\nHello TCP")
conn.close()
client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8080))
s.sendall(b"GET / HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")
print(s.recv(1024).decode())
s.close()
术语
| 缩写 | 说明 |
|---|---|
| SYN | Synchronize,TCP 连接建立请求标志位 |
| ACK | Acknowledgment,确认标志位,确认序号有效 |
| FIN | Finish,连接关闭请求标志位 |
| RST | Reset,异常重置连接标志位 |
| 滑动窗口 (Sliding Window) | TCP 流量控制 (Flow Control)核心机制,接收方通告可用缓冲区大小,发送方据此调节发送速率 |
| 拥塞控制 (Congestion Control) | 防止网络过载:慢启动 (Slow Start)(指数增长)→ 拥堵避免 (Congestion Avoidance)(线性增长)→ 快速恢复 (Fast Recovery) |
4.3 UDP 协议(传输层——不可靠)
UDP(User Datagram Protocol)提供无连接 (Connectionless)的、不可靠的、数据报 (Datagram)传输。不保证交付,无拥塞控制 (Congestion Control),头部仅 8 字节。适用于实时应用(VoIP、视频流、在线游戏)和简单查询(DNS)。
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 (Connection-Oriented)(三次握手 (Three-Way Handshake)) | 无连接 (Connectionless) |
| 可靠性 | 确认+重传,保证交付 | 不保证 |
| 顺序 | 严格保序 (In-Order Delivery) | 不保证 |
| 头部大小 | 20~60 字节 | 8 字节 |
| 流量/拥塞控制 (Congestion Control) | 有 | 无 |
| 典型应用 | HTTP、SSH、FTP、SMTP | DNS、VoIP、视频流、QUIC |
4.4 DNS 协议(应用层——域名解析)
DNS(Domain Name System)是互联网的"电话簿",将人类可读的域名(如 www.example.com)转换为机器可读的 IP 地址。使用 UDP 端口 53(也可走 TCP 53 或 HTTPS/DoH)。
DNS 记录类型:
| 类型 | 用途 | 示例 |
|---|---|---|
| A | 域名 → IPv4 | example.com → 93.184.216.34 |
| AAAA | 域名 → IPv6 | example.com → 2606:2800:220:1:248:1893:25c8:1946 |
| CNAME | 别名 | www.example.com → example.com |
| MX | 邮件服务器 | example.com → mail.example.com |
| NS | 权威 DNS 服务器 | example.com → ns1.example.com |
| TXT | 文本记录(验证等) | SPF、DKIM、域名验证 |
dig +short A example.com # 查 IPv4 dig +short AAAA example.com # 查 IPv6 dig +short MX example.com # 查邮件服务器 dig +trace example.com # 跟踪递归解析全过程 nslookup example.com # Windows 风格查询
术语
| 缩写 | 全称 | 说明 |
|---|---|---|
| DoH | DNS over HTTPS | 将 DNS 查询封装在 HTTPS 中传输,防 ISP 窥探域名 |
| DoT | DNS over TLS | DNS 查询经 TLS 加密(端口 853),与 DoH 目的一致 |
| TLD | Top-Level Domain | 顶级域名,如 .com .org .cn .io |
| 权威 DNS | Authoritative DNS | 持有某域名最终解析记录的服务器,由域名所有者管理 |
| 递归 DNS | Recursive Resolver | 替客户端完成完整解析链路的 DNS 服务器,如 8.8.8.8, 114.114.114.114 |
| stub resolver | — | 操作系统内置的最小化 DNS 客户端,只负责把查询发给递归 DNS |
| SPF | Sender Policy Framework | 声明哪些邮件服务器有权以该域名发送邮件 |
| DKIM | DomainKeys Identified Mail | 邮件数字签名 (Digital Signature)验证,防止内容被篡改 |
4.5 TLS 协议(会话层 (Session Layer)——传输安全)
TLS(Transport Layer Security)在 TCP 之上提供加密、完整校验 (Integrity)和身份认证 (Authentication)。最新版本 TLS 1.3(RFC 8446)将握手从 2-RTT 优化为 1-RTT。
| 功能 | 机制 |
|---|---|
| 加密(Encryption) | 对称加密(AES-GCM、ChaCha20-Poly1305),数据在传输中不可读 |
| 完整性(Integrity) | HMAC / AEAD,防止数据被篡改 |
| 认证 (Authentication)(Authentication) | X.509 数字证书 + 非对称加密(ECDHE、RSA),验证服务器身份 |
TLS 1.3 握手流程(1-RTT):
- ClientHello:发送支持的密码套件 (Cipher Suite) + 密钥共享 (Key Share)(DH 公钥)
- ServerHello:选择密码套件 (Cipher Suite) + 密钥共享 (Key Share) + 证书 + Finished(已加密)
- Client Finished:验证证书,发送 Finished(已加密)
- 握手完成,开始传输应用数据(Application Data)
4.5.1 X.509 数字证书详解
证书的本质:一个符合 X.509 标准的二进制结构,包含以下核心字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| Subject | 证书持有者(域名/组织) | CN=*.example.com, O=Example Inc. |
| Subject Public Key | 持有者的公钥 | 256-bit ECDSA 公钥 |
| Issuer | 签发者(上级 CA) | CN=R3, O=Let's Encrypt |
| Validity | 有效期 (notBefore / notAfter) | 2026-01-01 ~ 2027-01-01 |
| Serial Number | 证书序列号 (Sequence Number)(唯一标识) | 0a:1b:2c:... |
| Signature Algorithm | 签发时使用的签名算法 | sha256WithRSAEncryption |
| Signature | CA 对上述字段的签名值 | 用 CA 私钥对 tbsCertificate 签名 |
| SAN (Subject Alternative Name) | 证书覆盖的域名列表 | example.com, *.example.com |
核心原理:CA 用自己的私钥对证书内容做数字签名 (Digital Signature)。客户端用 CA 的公钥验签,若通过则证明"证书内容未被篡改,且该公钥确实属于 Subject"。这是信任链 (Chain of Trust)的根基。
4.5.2 PEM 格式
PEM(Privacy-Enhanced Mail)是最常见的证书编码格式。本质是 DER 二进制内容的 Base64 编码,用 -----BEGIN/END----- 头尾包裹,方便文本传输和粘贴。
| 格式 | 编码 | 扩展名 | 典型应用 |
|---|---|---|---|
| PEM | Base64 文本 | .pem, .crt, .key, .csr | Apache, Nginx, Linux 系统 |
| DER | 二进制 | .der, .cer | Java, Windows |
| PKCS#12 | 二进制(含私钥+证书) | .pfx, .p12 | Windows IIS, 导入浏览器 |
| JKS | Java Keystore | .jks | Java/Tomcat |
-----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDQgK2A... ... (Base64 encoded DER) ... -----END CERTIFICATE-----
明文查看 PEM 内容:
openssl x509 -in cert.pem -text -noout
4.5.3 证书存储位置
| 位置 | 路径 | 说明 |
|---|---|---|
| Linux 系统信任库 | /etc/ssl/certs/ | Debian/Ubuntu 系列,由 ca-certificates 包管理 |
/etc/pki/tls/certs/ | RHEL/CentOS/Fedora 系列 | |
| macOS 系统信任库 | 钥匙串访问 (Keychain) | /System/Library/Keychains/SystemRootCertificates.keychain |
| Nginx/Apache | 配置文件指定,通常 /etc/nginx/ssl/ | 需同时配置 ssl_certificate 和 ssl_certificate_key |
| Java | $JAVA_HOME/lib/security/cacerts | JKS 格式,默认密码 changeit |
| Chrome | 系统信任库(Win/macOS)或 NSS DB(Linux) | chrome://settings/certificates |
| Firefox | 独立 NSS 证书库,不依赖操作系统 | ~/.mozilla/firefox/*/cert9.db |
| Let's Encrypt | /etc/letsencrypt/live/<domain>/ | certbot 默认输出路径 |
4.5.4 实战:生成与使用证书
1. 生成私钥:
# ECDSA (推荐,性能好,密钥小) openssl ecparam -genkey -name prime256v1 -out server.key # RSA 2048 (兼容性最好) openssl genrsa -out server.key 2048
2. 生成 CSR(证书签名请求):
openssl req -new -key server.key -out server.csr \ -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=MicroArch/CN=*.example.com"
3. 自签名证书(开发/测试用):
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \ -days 365 -nodes \ -keyout server.key -out server.crt \ -subj "/CN=localhost" \ -addext "subjectAltName=DNS:localhost,DNS:*.local"
4. 查看证书内容:
openssl x509 -in server.crt -text -noout # 全部字段 openssl x509 -in server.crt -dates -noout # 仅有效期 openssl x509 -in server.crt -subject -noout # 仅 Subject openssl x509 -in server.crt -fingerprint -sha256 -noout # 指纹
5. 验证证书链:
# 验证服务器证书是否由指定 CA 签发 openssl verify -CAfile ca-bundle.crt server.crt # 查看远端服务器证书链 openssl s_client -connect example.com:443 -showcerts /dev/null \ | openssl x509 -text -noout # 检查证书过期时间 echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \ | openssl x509 -noout -dates
6. Nginx 配置 TLS:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem; # 证书+中间CA
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem; # 私钥
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off; # TLS 1.3 由客户端优先
}
7. 格式转换:
# PEM → DER openssl x509 -in cert.pem -outform der -out cert.der # PEM → PKCS#12 (含私钥) openssl pkcs12 -export -in cert.pem -inkey server.key -out cert.pfx # 查看 Java cacerts 中的证书 keytool -list -v -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
4.5.5 证书信任模型
自签名 vs CA 签名:任何人都可以用 OpenSSL 生成自签名证书,无需经过任何第三方。区别在于:自签名证书浏览器会弹"不安全"警告,因为没有 CA 背书;CA 签名证书浏览器信任,显示绿色锁。内网/开发用自签名完全够,公网面向用户则需 CA 签发。
CA 背书是什么:CA(Certificate Authority,证书颁发机构)用它的私钥给你的证书做数字签名 (Digital Signature)——相当于"盖个章"。浏览器/操作系统内置了受信任 CA 的公钥,访问网站时用这个公钥验签:签名验证通过则说明"该证书确实由我信任的 CA 签发,未被伪造",于是显示绿色锁。
为什么需要 CA:公钥本身没法证明"我是谁"。任何人都能把公钥和一个域名写进证书,然后自称是 google.com。浏览器接到这个证书后无法判断真假——它需要一个自己本来就信任的第三方来担保。CA 在签发前会验证你对域名有控制权,所以浏览器信任 CA 的判断。根子上是个信任传递 (Transitive Trust)问题:你不可能认识互联网上所有服务器,但你认识操作系统里预设的那几百个 CA。
根证书为什么不能伪造:你伪造一个根证书,写上"我是 CA",但浏览器会用它内置的根 CA 公钥去验证——这个公钥是编译进操作系统/浏览器的,不修改源码就换不掉。而伪造的证书和真 CA 的私钥不匹配,签名验证直接失败。根证书的安全不靠证书本身,靠的是:私钥在 CA 手里不泄露 + 浏览器预先写死公钥。两个卡住一个就通不过。
证书为什么有免费的也有收费的:
| 类型 | 验证深度 | 证书内容 | 费用 | 典型场景 |
|---|---|---|---|---|
| DV(域名验证) | 只验证域名控制权 | 仅含域名 | 免费 | Let's Encrypt,个人博客、小站点 |
| OV(组织验证) | 人工核验企业营业执照、法人身份 | 含公司名称 | 数百至数千元/年 | 企业官网、电商 |
| EV(扩展验证) | 最严格审查,实地核验等 | 含公司名称,曾显示绿色地址栏 | 数千至上万元/年 | 银行、金融、支付 |
云厂商收费除 OV/EV 人工审核成本外,还附带赔付保险(证书泄露导致钓鱼损失可索赔数十万)和技术支持。普通个人/小站点用 Let's Encrypt 足够了,大企业银行才需要 OV/EV。
术语
| 缩写 | 全称 | 说明 |
|---|---|---|
| RSA | Rivest-Shamir-Adleman | 经典非对称加密算法,可用于加密和签名,密钥 2048-4096 bit |
| ECDHE | Elliptic Curve Diffie-Hellman Ephemeral | 椭圆曲线临时密钥交换。每次会话生成临时密钥对,提供前向保密 (Forward Secrecy) |
| ECDSA | Elliptic Curve Digital Signature Algorithm | 椭圆曲线数字签名 (Digital Signature),比 RSA 密钥短且运算快 |
| DH | Diffie-Hellman | 密钥交换协议。双方在不安全信道上交换公钥后各自计算共享密钥 |
| AES-GCM | Advanced Encryption Standard - Galois/Counter Mode | 对称加密 + 认证 (Authentication)模式,同时提供加密和完整校验 (Integrity),TLS 1.3 首选 |
| AEAD | Authenticated Encryption with Associated Data | 认证 (Authentication)加密模式,加密的同时自动校验完整性 |
| HMAC | Hash-based Message Authentication Code | 基于哈希的消息认证 (Authentication)码,保证数据未被篡改 |
| X.509 | — | 公钥证书的国际标准格式,定义了证书字段结构 |
| SAN | Subject Alternative Name | 证书扩展字段,列出证书覆盖的所有域名 |
| CN | Common Name | 证书主体通用名,通常为域名。现代浏览器优先检查 SAN |
| CA | Certificate Authority | 证书颁发机构,如 Let's Encrypt、DigiCert |
| CSR | Certificate Signing Request | 证书签名请求,包含公钥和域名信息,提交给 CA 申请签发 |
| PEM | Privacy-Enhanced Mail | Base64 文本证书格式,-----BEGIN/END----- 包裹 |
| DER | Distinguished Encoding Rules | X.509 二进制编码格式,PEM 是 DER 的 Base64 文本化 |
| PKCS#12 | — | 二进制格式(.pfx/.p12),含私钥+证书,用于导入浏览器/IIS |
| JKS | Java KeyStore | Java 特有的密钥和证书存储格式 |
| CRL | Certificate Revocation List | 证书吊销列表,CA 定期发布 |
| OCSP | Online Certificate Status Protocol | 在线证书状态协议,实时查询单张证书是否有效 |
| DV/OV/EV | Domain/Organization/Extended Validation | 证书验证等级:DV 只验证域名(免费);OV 核验企业;EV 最严格 |
| 前向保密 (Forward Secrecy) | Forward Secrecy | 即使服务器私钥泄露,历史通信也无法解密。ECDHE 提供,RSA 密钥交换不提供 |
| 密码套件 (Cipher Suite) | Cipher Suite | TLS 握手协商的算法组合,如 TLS_AES_128_GCM_SHA256 |
4.6 HTTP 协议(应用层——超文本传输)
HTTP(Hypertext Transfer Protocol)是 Web 的基础。采用请求-响应 (Request-Response)模型,典型工作流:
- 建立 TCP/TLS 连接
- 发送 HTTP 请求消息
- 读取服务器返回的 HTTP 响应消息
- 关闭或复用连接
HTTP 请求格式:
METHOD /path HTTP/1.1 Header-Name: value Header-Name: value [空行] [可选请求体]
HTTP 响应格式:
HTTP/1.1 200 OK Header-Name: value Content-Type: text/html [空行] <!DOCTYPE html>...
常用请求方法:
| 方法 | 语义 | 安全 | 幂等 |
|---|---|---|---|
| GET | 获取资源 | 是 | 是 |
| POST | 创建资源 / 提交数据 | 否 | 否 |
| PUT | 替换资源(全量更新) | 否 | 是 |
| PATCH | 部分修改资源 | 否 | 否 |
| DELETE | 删除资源 | 否 | 是 |
| HEAD | 获取响应头(无响应体) | 是 | 是 |
| OPTIONS | 查询支持的方法 | 是 | 是 |
HTTP 核心特性:
| 特性 | 说明 |
|---|---|
| 无状态 | 每个请求独立,服务器不保留上下文。通过 Cookie / Session / Token 弥补 |
| 可扩展 | 通过 Header 扩展新功能(CORS、CSP、HSTS、Cache-Control 等) |
| 缓存 | 通过 Cache-Control、ETag、Last-Modified 等控制缓存行为 |
| 内容协商 (Content Negotiation) | 通过 Accept、Accept-Language 等 Header 协商返回格式 |
| 认证 (Authentication) | Basic Auth(Base64)、Bearer Token、Digest Auth、OAuth 2.0 等 |
| CORS | 跨域资源共享,通过 Access-Control-Allow-Origin 等 Header 控制 |
fetch('https://api.example.com/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Alice', email: 'alice@example.com' })
})
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error('Error:', err));
术语
| 缩写 | 全称 | 说明 |
|---|---|---|
| CORS | Cross-Origin Resource Sharing | 跨域资源共享,通过 HTTP 头允许网页向不同域名发起请求 |
| CSP | Content Security Policy | 内容安全策略,声明允许加载的资源来源,防御 XSS 攻击 |
| HSTS | HTTP Strict Transport Security | 强制 HTTPS,告知浏览器永远用 HTTPS 访问该域名 |
| ETag | Entity Tag | 资源版本标识,配合 If-None-Match 实现条件请求(304) |
| MIME | Multipurpose Internet Mail Extensions | 数据类型标识,如 text/html、application/json |
| 幂等 | Idempotent | 同一操作执行多次与一次效果相同。GET/PUT/DELETE 幂等,POST 不幂等 |
| Cookie | — | 服务器让浏览器存储的小段数据,每次请求自动带回,维持会话状态 |
| Session | — | 服务端存储的用户会话数据,客户端只持有 Session ID |
| Token | — | 自包含凭证(如 JWT),服务端可无状态验证,不需要服务端存储 |
4.7 HTTP/2 & HTTP/3(QUIC)
| 特性 | HTTP/1.1 | HTTP/2 | HTTP/3 (QUIC) |
|---|---|---|---|
| 传输层 | TCP | TCP | UDP (QUIC) |
| 多路复用 | 无(需多个连接) | Stream 多路复用 | Stream 多路复用(无队头阻塞 (Head-of-Line Blocking)) |
| 头部压缩 | 无 | HPACK | QPACK |
| 加密 | 可选(TLS) | 可选(TLS,浏览器要求必须) | 内置 TLS 1.3 |
| 连接建立 | TCP + TLS (2-3 RTT) | TCP + TLS (2-3 RTT) | 0-RTT / 1-RTT |
| 服务器推送 | 无 | 支持 | 支持 |
| 队头阻塞 (Head-of-Line Blocking) | 有(连接级) | 有(TCP 级) | 无 |
| RFC | 7230-7235 | 7540 | 9114 |
术语
| 缩写 | 全称 | 说明 |
|---|---|---|
| HOL Blocking | Head-of-Line Blocking | 队头阻塞 (Head-of-Line Blocking)。一个包的丢失/延迟导致后续所有包都被堵住 |
| HPACK | — | HTTP/2 头部压缩算法,使用静态/动态字典 |
| QPACK | — | HTTP/3 头部压缩算法,解决 HPACK 在 QUIC 上的队头阻塞 (Head-of-Line Blocking)问题 |
| QUIC | Quick UDP Internet Connections | 基于 UDP 的新一代传输层协议,内置 TLS 1.3、多路复用、0-RTT、连接迁移 (Connection Migration) |
| Stream | — | 单连接内独立的双向字节流 (Byte Stream),多路复用允许多个 Stream 并发互不阻塞 |
| 连接迁移 (Connection Migration) | Connection Migration | QUIC 特性:切换网络(Wi-Fi→4G)保持连接不断,通过 Connection ID 而非 IP 标识 |
4.8 SSE 服务器推送(Server-Sent Events)
SSE 是 HTTP 标准的一部分(HTML Standard / text/event-stream),允许服务器通过一个持久的 HTTP 长连接 (Persistent Connection)单向向客户端推送数据流。与 WebSocket 不同,SSE 仅支持服务器 → 客户端方向,但不需要协议升级 (Protocol Upgrade),天然兼容 HTTP 基础设施(代理、CDN、认证 (Authentication))。
| 特性 | 说明 |
|---|---|
| 方向 | 单向:服务器 → 客户端(客户端用普通 HTTP 发请求) |
| 传输层 | HTTP/1.1 长连接 (Persistent Connection)(Connection: keep-alive)或 HTTP/2 Stream |
| MIME 类型 | text/event-stream |
| 自动重连 (Automatic Reconnection) | 内置:连接断开后浏览器自动重连 (Automatic Reconnection)(Last-Event-ID) |
| 事件类型 | 默认 message,可自定义 event: xxx 字段 |
| 客户端 API | EventSource 构造函数(标准浏览器 API) |
| 二进制数据 | 仅支持 UTF-8 文本(二进制需 Base64 编码) |
SSE 数据格式(text/event-stream):
event: update\n
id: 42\n
data: {"price": 18.5, "change": +0.3}\n
\n
data: {"price": 18.7, "change": +0.2}\n
\n
字段说明:data: 定义消息体;event: 自定义事件名;id: 消息编号(用于断线重连);空行(\n\n)表示消息边界。
server-sse.js (Node.js)
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Access-Control-Allow-Origin': '*'
});
let id = 0;
setInterval(() => {
res.write(`id: ${++id}\\n`);
res.write(`data: ${JSON.stringify({ time: Date.now(), id })}\\n\\n`);
}, 1000);
}).listen(3000);
console.log('SSE server on http://localhost:3000');
client.html (浏览器)
const es = new EventSource('http://localhost:3000');
es.onmessage = (e) => console.log('Message:', JSON.parse(e.data));
es.onerror = () => console.log('Disconnected, auto-reconnecting...');
// 自定义事件监听
es.addEventListener('update', (e) => console.log('Update:', e.data));
// 关闭连接
// es.close();
4.9 WebSocket 协议
WebSocket(RFC 6455)提供全双工 (Full-Duplex)、低延迟、持久的双向通信通道。它通过 HTTP Upgrade 机制从 HTTP/1.1 升级到 ws:// 或加密 wss:// 协议,之后数据以帧(Frame)的形式双向传输,不再有 HTTP 头部开销。
| 特性 | 说明 |
|---|---|
| 方向 | 全双工 (Full-Duplex):客户端 ↔ 服务器双向 |
| 握手 | HTTP Upgrade(101 Switching Protocols) |
| 帧开销 | 最小 2 字节(相比 HTTP 显著降低) |
| 支持数据类型 | 文本(UTF-8)和二进制(Blob/ArrayBuffer) |
| 客户端 API | WebSocket 构造函数(标准浏览器 API) |
| 子协议 | STOMP、MQTT、WAMP 等 |
| 代理兼容性 | 需要代理支持 WebSocket(部分老代理不支持) |
server-ws.js (需 npm install ws)
const { WebSocketServer } = require('ws');
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (ws) => {
console.log('Client connected');
ws.on('message', (data) => {
console.log('Received:', data.toString());
ws.send(`Echo: ${data}`);
});
ws.send('Welcome to WebSocket server');
});
client.html (浏览器)
const ws = new WebSocket('ws://localhost:8080');
ws.onopen = () => { ws.send('Hello Server!'); };
ws.onmessage = (e) => console.log('Received:', e.data);
ws.onclose = () => console.log('Disconnected');
ws.onerror = (e) => console.error('Error:', e);
// ws.close();
| 对比维度 | SSE | WebSocket |
|---|---|---|
| 通信方向 | 服务器 → 客户端(单向) | 双向 |
| 协议 | HTTP(标准) | ws:// / wss://(独立协议) |
| 数据格式 | UTF-8 文本 | 文本 + 二进制 |
| 自动重连 (Automatic Reconnection) | 内置 | 需手动实现 |
| 心跳保活 | 可选(浏览器端无 API) | ping/pong 帧 |
| 代理/CDN 兼容 | 天然兼容 HTTP | 需代理支持 Upgrade |
| 典型场景 | 通知、股价、日志流、AI 流式输出 | 聊天、协作编辑、游戏、实时仪表盘 |
术语
| 缩写 | 说明 |
|---|---|
| 全双工 (Full-Duplex) | 双方可同时发送数据(如电话)。vs 半双工 (Half-Duplex):同一时间只能一方发(如对讲机) |
| opcode | WebSocket 帧操作码:1=文本, 2=二进制, 8=关闭, 9=ping, 10=pong |
| ping/pong | 心跳机制。一方发 ping 帧,另一方须回 pong,用于检测连接存活 |
| HTTP Upgrade | HTTP/1.1 机制。客户端发送 Upgrade: websocket 头,服务器回应 101 切换协议 |
4.10 网络代理 (Proxy)
代理服务器(Proxy)是介于客户端与目标服务器之间的中转节点。根据部署方向和使用场景,分为正向代理 (Forward Proxy)和反向代理 (Reverse Proxy)两大类。
4.10.0 程序为什么会走代理
程序走代理的本质是:不直接连目标服务器,而是先连代理服务器,让代理帮你转发请求。实现方式分两种:
1. 程序自己读代理配置(显式代理 (Explicit Proxy)):
程序启动时检查环境变量 http_proxy / https_proxy 或自身配置文件。如果配了代理,就直接把请求发到代理地址而不是目标地址。curl、git、npm、pip 等工具都遵循这套约定——遍历 proxy 类环境变量,有就发给代理,没有就直连。
# 底层原理(以 curl 为例,伪代码)
target = "https://example.com"
proxy = getenv("https_proxy") # http://127.0.0.1:8080
if proxy:
tcp_connect(proxy) # 连代理 127.0.0.1:8080
send("CONNECT example.com:443") # 让代理去连目标
else:
tcp_connect("example.com:443") # 直连目标
2. 系统层劫持流量(透明代理 (Transparent Proxy) / TUN):
程序以为自己直连目标,实际上操作系统或网络设备在内核层把流量拦截下来,重定向到代理。
方式一:iptables REDIRECT / TPROXY
利用 Linux 内核的 Netfilter 框架,在数据包经过协议栈 (Protocol Stack)时用 iptables 规则匹配并改写目标地址:
# 将所有出站 TCP 80/443 流量劫持到本地 8080 端口 iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 8080
数据包路径:
- 程序调用
connect("example.com:443"),内核构造 SYN 包,目标 = example.com:443 - 包经过 OUTPUT 链 nat 表,命中 REDIRECT 规则,目标地址被改写为 127.0.0.1:8080
- 包到达本地 8080 端口(代理程序在监听)
- 代理收到连接后,通过
getsockopt(SO_ORIGINAL_DST)获取原始目标地址,然后自己去连真正的 example.com:443
关键:改写发生在内核 netfilter,用户态程序完全不知情。程序以为自己连了 example.com,实际 TCP 连接被偷换成了代理。REDIRECT 只适用于代理在本机;跨机器的网关场景用 TPROXY(保留原始目标地址不修改)。
方式二:路由 + TUN 虚拟网卡
大多数翻墙代理(Clash、Shadowsocks、v2ray)用的方案:
# 虚拟网卡 tap/tun 是什么 ip tuntap add tun0 mode tun # 创建虚拟三层网卡(无 MAC,纯 IP) ip addr add 198.18.0.1/16 dev tun0 # 配 IP ip link set tun0 up # 启用 ip route add default via 198.18.0.1 dev tun0 metric 1 # 默认路由走虚拟网卡
机制:
- 程序调用
send(sock, http_request),数据经内核 TCP/IP 栈封装成 IP 包 - 内核查路由表,匹配到
default via 198.18.0.1 dev tun0,把 IP 包写入/dev/net/tun字符设备 - 代理程序从
/dev/net/tun的 fd 里read()读出原始 IP 包 - 代理解析包中的目标 IP:Port,自己建加密隧道连远端服务器,把 IP 包转发过去
- 远端代理解包,以原始目标建 TCP 连接,把 payload 写入 → 响应原路返回
TUN 工作在网络层(IP 包),能劫持所有协议(TCP/UDP/ICMP 全部一刀切)。TAP 工作在链路层(以太帧),多一层 MAC 头,一般用于 VPN 做二层隧道。代理程序收到的就是完整的原始 IP 包,需要自己实现 TCP 状态跟踪。
方式三:浏览器 PAC(Proxy Auto-Config)
浏览器从 PAC URL 下载一个 JavaScript 文件,里面有 FindProxyForURL(url, host) 函数。浏览器每次发请求前调用这个函数,根据返回值决定:
function FindProxyForURL(url, host) {
if (shExpMatch(host, "*.internal.com")) return "DIRECT"; // 直连
if (shExpMatch(host, "*.google.com")) return "PROXY 127.0.0.1:1080"; // 走代理
return "SOCKS5 127.0.0.1:1080"; // 默认走 SOCKS5
}
PAC 只是"决策脚本",不劫持流量——浏览器拿到决策后自己选择连代理还是直连,跟显式代理 (Explicit Proxy)本质一样,只是规则自动化了。
对比三种方式拦截点:
| 方式 | 拦截层 | 适用范围 | 典型工具 |
|---|---|---|---|
| iptables REDIRECT/TPROXY | 内核 netfilter | 全局(所有程序),但代理须在本机或网关 | Squid, Envoy 透明代理 (Transparent Proxy) |
| TUN 虚拟网卡 | 内核路由 + 字符设备 | 全局、跨机器,支持所有协议 | Clash(TUN), Shadowsocks-rust, WireGuard |
| PAC / WPAD | 应用层(浏览器自己判断) | 仅浏览器 | Chrome/Edge 系统代理设置 |
对比:
| 方式 | 程序感知 | 典型实现 | 适用 |
|---|---|---|---|
| 显式代理 (Explicit Proxy) | 懂代理协议,主动连代理 | 环境变量 (http_proxy)、curl -x、git config http.proxy | 命令行工具、编程语言 HTTP 库 |
| 透明代理 (Transparent Proxy) | 无感知,以为直连目标 | iptables REDIRECT、TUN 虚拟网卡、路由器网关 | 全局代理、App 抓包、企业网关 |
一旦流量进入代理(不管是显式还是透明),后续都是:客户端 ↔ 代理 ↔ 目标服务器,代理做 TCP 字节流 (Byte Stream)转发(正向代理 (Forward Proxy))或按规则路由到后端(反向代理 (Reverse Proxy))。
各语言 HTTP 库代理支持一览:大部分主流语言的标准库或常用 HTTP 库已封装好代理逻辑,开发者写业务代码一般不用自己处理。有代理就走,没有就直连。
| 语言 / 工具 | 自动读环境变量 | 说明 |
|---|---|---|
| curl / wget | 是 | 自动读取 http_proxy / https_proxy,--noproxy 可跳过 |
Python requests | 是 | 自动从环境变量读代理,也支持 proxies 参数显式指定 |
Python httpx | 是 | 同 requests,默认读环境变量 |
Go net/http | 半自动 | 需在 Transport 里设 Proxy: http.ProxyFromEnvironment,默认 Transport 会自动配 |
Rust reqwest | 是 | 默认自动读 HTTP_PROXY / HTTPS_PROXY |
Node.js fetch (v18+) | 否 | 不自带代理支持,需额外装 global-agent 包或手动配 undici agent |
Node.js axios | 半自动 | 支持 proxy 配置项,不自动读环境变量 |
Java HttpURLConnection | 否 | 需 System.setProperty("http.proxyHost", ...") 手动设,或用 OkHttp / Apache HttpClient 等库 |
| git | 是 | git config http.proxy,也支持 http_proxy 环境变量 |
| npm / yarn / pip | 是 | 自动读环境变量,也可 CLI 参数 --proxy 覆盖 |
本质都是同一条链路:
程序 → 读环境变量/配置 → 有代理就连代理:port → 代理转发到目标
→ 无代理就直连目标
代理判断逻辑在用户态 HTTP 库里,内核只负责建 TCP 连接,不关心连接的是代理还是目标。
4.10.1 正向代理 (Forward Proxy) vs 反向代理 (Reverse Proxy)
| 维度 | 正向代理 (Forward Proxy) | 反向代理 (Reverse Proxy) |
|---|---|---|
| 服务对象 | 客户端(出站) | 服务端(入站) |
| 客户端感知 | 需显式配置代理地址 | 无感知,认为直连服务器 |
| 典型用途 | 科学上网、企业内网管控、匿名访问、缓存 | 负载均衡 (Load Balancing)、SSL 卸载、缓存、安全防护、灰度发布 (Canary Release) |
| 协议 | HTTP CONNECT / SOCKS5 | HTTP/HTTPS、TCP/UDP 四层转发 |
| 部署位置 | 靠近客户端(出口网关) | 靠近服务端(入口网关) |
| 软件 | Squid, Shadowsocks, Clash, v2ray | Nginx, HAProxy, Envoy, Traefik, Caddy |
4.10.2 代理协议类型
| 协议 | 端口 | 说明 |
|---|---|---|
| HTTP 代理 | 8080 / 3128 | 最基础的 Web 代理,通过 HTTP CONNECT 方法建立隧道转发 TCP 流(HTTPS 场景)。明文传输,本身无加密 |
| HTTPS 代理 | 8443 | HTTP 代理 + TLS,代理连接本身也被加密,防止中间人窃听代理流量 |
| SOCKS4 | 1080 | 仅支持 TCP,无认证 (Authentication),无 IPv6 |
| SOCKS5 | 1080 | 最通用:支持 TCP/UDP、IPv6、用户名/密码认证 (Authentication)。应用层无关,可转发任意协议(HTTP、SSH、FTP、游戏) |
| 透明代理 (TPROXY) | — | 客户端无需配置,通过 iptables/nftables 在内核层劫持流量并重定向到代理。常用于企业网关 |
| 反向代理 (Reverse Proxy) | 80/443 | 接收外部请求,按规则转发到后端。四层 (L4, Stream) 基于 IP:Port 转发;七层 (L7, HTTP) 基于 Host/Path/Header 转发 |
4.10.3 HTTP CONNECT 隧道机制
浏览器访问 HTTPS 网站时,首先向代理发送 CONNECT 请求建立隧道,之后所有流量(包括 TLS 握手和加密数据)透明穿透代理,代理只做 TCP 字节流 (Byte Stream)转发,无法解密内容(区别于 MITM 代理)。
# 客户端 → 代理:建立隧道 CONNECT example.com:443 HTTP/1.1 Host: example.com:443 # 代理 → 客户端:隧道已建立 HTTP/1.1 200 Connection Established # 此后客户端 ↔ 服务器直通(经代理 TCP 转发) # TLS 握手、HTTP 请求全部透明穿透
4.10.4 实战操作
1. 命令行使用代理:
# HTTP/HTTPS 代理 export http_proxy="http://127.0.0.1:8080" export https_proxy="http://127.0.0.1:8080" export no_proxy="localhost,127.0.0.1,.internal.local" # SOCKS5 代理 (curl) curl --socks5 127.0.0.1:1080 https://example.com # Git 代理 git config --global http.proxy http://127.0.0.1:8080 git config --global http.proxy socks5://127.0.0.1:1080 # SSH 通过代理连接 (ProxyJump / ProxyCommand) ssh -o ProxyCommand='nc -X 5 -x 127.0.0.1:1080 %h %p' user@remote # 或 ~/.ssh/config: # Host remote # ProxyJump user@jump-host # # 或 ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
2. Nginx 反向代理 (Reverse Proxy)配置:
# L7 HTTP 反向代理
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# L4 TCP 反向代理 (Stream 模块, 需编译 --with-stream)
stream {
upstream mysql_backend {
server 10.0.1.10:3306;
server 10.0.1.11:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_backend;
proxy_connect_timeout 5s;
}
}
# SSL 卸载(反向代理终结 TLS,后端 HTTP)
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location / {
proxy_pass http://backend:3000; # 后端只需 HTTP
}
}
3. 代理环境变量说明:
| 环境变量 | 作用 |
|---|---|
http_proxy | HTTP 请求使用的代理 |
https_proxy | HTTPS 请求使用的代理(实际走 CONNECT 隧道) |
no_proxy | 不走代理的域名/IP 列表(逗号分隔,支持通配符) |
ALL_PROXY | 所有协议的兜底代理(部分工具支持) |
HTTP_PROXY | 大写形式,部分工具(Docker, Go)识别大写;curl 识别小写。建议同时设置 |
4.10.5 MITM 调试代理工具
上述代理(正向/反向)只做透明转发 (Transparent Forwarding),不解密流量。而开发调试中经常需要查看和修改加密的 HTTPS 内容,此时需要使用 MITM(Man-in-the-Middle)代理工具。它们通过在本机安装自签 CA 根证书,以中间人身份解密 HTTPS,让开发者可以检查、修改、重放 HTTP 请求。
| 工具 | 平台 | 特点 |
|---|---|---|
| Charles | macOS / Windows / Linux | GUI 友好,功能全面(断点、重写、限速、Map Local/Remote),商业软件 |
| Proxyman | macOS (原生) | 原生 macOS App,UI 精致,支持 iOS/Android 远程抓包 (Remote Capture),Apple Silicon 原生 |
| mitmproxy | 跨平台 (CLI) | 开源、命令行 + Web UI + Python API 脚本化,可编程拦截/修改流量 详见 mitmproxy 系统梳理 |
| Wireshark | 跨平台 | 网络包级别抓包(非代理,旁路抓取 (Passive Capture)),支持 3000+ 协议解析,需密钥日志文件解密 TLS 更适合底层 TCP/IP 问题排查,非 HTTP 调试首选 |
| Fiddler | Windows / Linux (beta) | 老牌 Windows 抓包工具,支持脚本扩展 |
MITM 工作原理:
- 客户端信任 MITM 代理的自签 CA 证书(手动安装到系统/Browser 信任库)
- 客户端连接代理,发起 CONNECT 请求
- 代理与目标服务器完成真实的 TLS 握手(代理 → 服务器端)
- 代理用自签 CA 动态签发一个伪造的目标域名证书,与客户端完成 TLS 握手(客户端 → 代理端)
- 代理持有两段 TLS 会话的密钥,可解密、查看、修改双向流量
# mitmproxy 快速上手 brew install mitmproxy # 安装 mitmweb # Web UI 模式 (http://localhost:8081) # 或 mitmproxy (CLI TUI 模式) # 设置系统代理指向 mitmproxy 默认端口 8080 export https_proxy="http://127.0.0.1:8080" # 首次使用需安装证书:浏览器访问 http://mitm.it # Charles / Proxyman:GUI 工具直接启动,自动配置系统代理
SSLKEYLOGFILE 环境变量导出会话密钥。Charles/Proxyman/mitmproxy 是应用层代理,通过 MITM 技术解密,更方便查看 HTTP 层面的请求和响应。日常 Web/API 调试优先选后者,TCP/IP 底层问题才用 Wireshark。
术语
| 缩写 | 全称 | 说明 |
|---|---|---|
| SOCKS5 | Socket Secure v5 | 通用代理协议,支持 TCP/UDP、IPv6、认证 (Authentication)。应用层无关,可转发任意协议 |
| MITM | Man-In-The-Middle | 中间人代理,通过伪造证书解密 HTTPS 流量,用于调试和抓包 |
| TUN / TAP | — | 虚拟网卡接口:TUN 工作在网络层(IP 包),TAP 工作在链路层(以太帧) |
| netfilter | — | Linux 内核网络过滤框架,iptables/nftables 是其用户态管理工具 |
| iptables | — | Linux 防火墙/流量管理工具,用于包过滤、NAT、流量劫持 |
| PAC | Proxy Auto-Config | 浏览器代理自动配置脚本,根据 URL 规则决定走代理还是直连 |
| WPAD | Web Proxy Auto-Discovery | 代理自动发现协议,通过 DHCP/DNS 自动找到 PAC 文件 URL |
| L4 代理 | — | 四层代理:基于 IP:Port 转发 TCP/UDP 流,不解析应用协议 |
| L7 代理 | — | 七层代理:解析 HTTP 头后根据 Host/Path/Header 路由到不同后端 |
| SSL 卸载 | SSL Termination | 反向代理 (Reverse Proxy)在入口处终结 TLS,之后将明文 HTTP 转发到后端服务 |
| API 网关 | API Gateway | 微服务统一入口,集成认证 (Authentication)、限流、路由、日志。本质是 L7 反向代理 (Reverse Proxy)+业务逻辑 |
5. 实战速查手册
5.1 常见端口
| 端口 | 协议 | 说明 |
|---|---|---|
| 20/21 | FTP | 文件传输协议 |
| 22 | SSH | 安全 Shell |
| 25 | SMTP | 邮件发送 |
| 53 | DNS | 域名解析(UDP/TCP) |
| 67/68 | DHCP | IP 地址自动分配 |
| 80 | HTTP | 超文本传输 |
| 110 | POP3 | 邮件接收 |
| 143 | IMAP | 邮件接收(高级) |
| 443 | HTTPS | HTTP over TLS |
| 1080 | SOCKS5 | SOCKS5 代理 |
| 3128 | Squid | HTTP 代理(Squid 默认) |
| 8080 | HTTP Proxy | HTTP 正向代理 (Forward Proxy)(常见替代端口) |
| 993 | IMAPS | IMAP over TLS |
| 995 | POP3S | POP3 over TLS |
| 3306 | MySQL | 数据库 |
| 5432 | PostgreSQL | 数据库 |
| 6379 | Redis | 缓存 |
| 27017 | MongoDB | 数据库 |
5.2 HTTP 状态码速查
| 范围 | 类别 | 常用示例 |
|---|---|---|
| 1xx | 信息 | 101 Switching Protocols(WebSocket 升级) |
| 2xx | 成功 | 200 OK, 201 Created, 204 No Content |
| 3xx | 重定向 | 301 永久, 302 临时, 304 Not Modified(缓存), 307/308 保留方法 |
| 4xx | 客户端错误 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 405 Method Not Allowed, 429 Too Many Requests |
| 5xx | 服务端错误 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout |
5.3 常用调试命令
| 场景 | 命令 | 说明 |
|---|---|---|
| DNS 查询 | dig example.com / nslookup example.com | 查询 DNS 记录 |
| 连通性测试 | ping -c 4 example.com | ICMP 测试网络连通性 |
| 路由追踪 | traceroute example.com / tracert example.com | 追踪数据包路径 |
| 端口检测 | nc -zv example.com 443 / telnet example.com 80 | 检测端口是否开放 |
| HTTP 请求 | curl -v https://example.com | 查看完整的 HTTP 交互 |
| 抓包分析 | tcpdump -i eth0 port 443 -w out.pcap | 抓取网络包 |
| TLS 证书 | openssl s_client -connect example.com:443 | 查看 TLS 证书链 |
| 性能测试 | curl -w "@curl-format.txt" https://example.com | 测量各阶段耗时 |
| 连接状态 | ss -tunap / netstat -an | 查看当前所有连接 |
time_namelookup: %{time_namelookup}\\n
time_connect: %{time_connect}\\n
time_appconnect: %{time_appconnect}\\n
time_pretransfer: %{time_pretransfer}\\n
time_redirect: %{time_redirect}\\n
time_starttransfer: %{time_starttransfer}\\n
----------\\n
time_total: %{time_total}\\n
参考文献
- RFC 791 — Internet Protocol (IP)
- RFC 793 — Transmission Control Protocol (TCP)
- RFC 768 — User Datagram Protocol (UDP)
- RFC 1035 — Domain Name System
- RFC 8446 — TLS 1.3
- RFC 9110 — HTTP Semantics
- RFC 9113 — HTTP/2
- RFC 9114 — HTTP/3
- RFC 8999 — QUIC
- MDN — HTTP Overview
- MDN — Transport Layer Security
- MDN — TCP Glossary
- MDN — DNS Glossary
- Wikipedia — Internet Protocol Suite
- Wikipedia — OSI Model